<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/2/26
 * Time: 9:17
 */

namespace app\common;


use app\BaseController;

class Csv
{

    public static function read(){

           set_time_limit(0);
           @ob_end_clean();  //清除内存
           $file = fopen('./apply.csv', 'r');
           $data = [];
           while ($rows = fgetcsv($file)) {    //每次读取CSV里面的一行内容
               //print_r($data); //此为一个数组，要获得每一个数据，访问数组下标即可
               $data[] = $rows;
               // dump($data);
           }
           fclose($file);
           return $data;
       }

    //写入csv文件里
    public function write($head,$field, $table, $fileName = "test.csv")
    {


        set_time_limit(0);
        ini_set('max_execution_time',0); //设置程序的执行时间,0为无上限
        @ob_end_clean();  //清除内存
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Type: charset=utf-8'); // 文件编码
        header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
        header('Cache-Control: max-age=0');
        $class =  '\app\console\model\\'.$table;
        $model = new $class;
        $sqlCount = $model->count();

        //输出Excel文件头，可把user.csv换成你要的文件名
        foreach($head as $k=>$v){
          //  $head[$k] = iconv("UTF-8","GBK//IGNORE",$v);    //将utf-8编码转为gbk。理由是： Excel 以 ANSI 格式打开，不会做编码识别。如果直接用 Excel 打开 UTF-8 编码的 CSV 文件会导致汉字部分出现乱码。
        }
        //转为gbk的时候可能会遇到特殊字符“_”之类的会报错，加ignore表示这个特殊字符直接忽略不做转换。
        $sqlLimit = 10;//每次只从数据库取100000条以防变量缓存太大
        //每隔$limit行，刷新一下输出buffer，不要太大，也不要太小
        //buffer计数器
        $limit = 100;
        $cnt = 0;
        //$fileNameArr = array();
        //逐行取出数据，不浪费内存
        //dump(ceil($sqlCount / $sqlLimit));
        $fp = fopen('php://output', 'a'); //打开php文件句柄，php://output表示直接输出到PHP缓存,a表示将输出的内容追加到文件末尾
        fputcsv($fp, $head);
        for ($i = 0; $i < ceil($sqlCount / $sqlLimit); $i++) {


            //dump($i);

            //chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限
            //$fp = fopen($mark . '_' . $i . '.csv', 'w'); //生成临时文件//一个是生成文件一个是浏览器打开fputcsv位置不同

            //$fileNameArr[] = $mark . '_' . $i . '.csv';
            //将数据通过fputcsv写到文件句柄


            $dataArr = $model->field($field)->limit($i * $sqlLimit, $sqlLimit)->select()->toArray();
           // dump($dataArr);
            foreach ($dataArr as &$a) {
                $cnt++;
               // dump($a['id']);
                $a['id_card'] = $a['id_card']."\t";
                fputcsv($fp, $a);
                if ($limit == $cnt) {
                    //刷新一下输出buffer，防止由于数据过多造成问题
//                    ob_flush();
//                    flush();
                    $cnt = 0;
                }
                //fputcsv($fp, $a);

            }


        }
        fclose($fp);//每生成一个文件关闭




       }

    #生成一个csv，header不能重写 不知道好不好使
    function exportToExcel($fileName = '', $headArr = [], $data = []){
        ini_set('memory_limit','1024M'); //设置程序运行的内存
        ini_set('max_execution_time',0); //设置程序的执行时间,0为无上限
        @ob_end_clean();  //清除内存
        ob_start();
        @header("Content-Type: text/csv");
        @header("Content-Disposition:filename=".$fileName.'.csv');
        $fp=fopen('php://output','w');
        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
        fputcsv($fp,$headArr);
        $index = 0;
        foreach ($data as $item) {
            if($index==1000){ //每次写入1000条数据清除内存
                $index=0;
                ob_flush();//清除内存
                flush();
            }
            $index++;
            fputcsv($fp,$item);
        }

        @ob_flush();
        flush();
        ob_end_clean();
        return;
    }
}